package main

import "fmt"

// 闭包
// 匿名函数引用的外部变量 共同构成闭包
// n1 只初始化一次，后面逐渐递加
func getAndAdd() func(int2 int) int {
	var n1 int = 10
	return func(n2 int) int {
		n1 = n1 + n2
		return n1
	}
}

func main() {
	a := getSum
	res := a(20, 30)
	fmt.Println(res)

	res2 := myFunc(getSum, 30, 40)
	fmt.Println(res2)

	res3 := myFunc2(getSum, 40, 40)
	fmt.Println(res3)

	result4, result5 := getSumAndSub(30, 30)
	fmt.Println(result4, result5)

	fmt.Println("====闭包===")
	f := getAndAdd()
	fmt.Println(f(1))
	fmt.Println(f(2))
	fmt.Println(f(3))

}

func getSum(n1 int, n2 int) int {
	return n1 + n2
}

func myFunc(funcVar func(int, int) int, n1 int, n2 int) int {
	return funcVar(n1, n2)
}

// 自定义类型
type myFunType func(int, int) int

func myFunc2(funcVar myFunType, n1 int, n2 int) int {
	return funcVar(n1, n2)
}

// 返回值重命名
func getSumAndSub(n1 int, n2 int) (sum int, sub int) {
	sum = n1 + n2
	sub = n1 - n2
	return
}
